在一段利(沒)用(事)鏈(找)表(事)來實現正整數相加的程序中,有一個函數是這樣的,實現了將位數較小的鏈表最高位加到位數較大的鏈表上的功能。
void addMostDigit(List addee, List adder){//addee的位數不小于adder
? ? int index = addee.size() - adder.size();
? ? int sum = addee.get(index)->digit + adder.header->digit;
? ? adder.header = adder.header->next;
?
? ? if (sum < 10)
? ? {
? ? ? ? addee.get(index)->digit = sum;
? ? ? ? return;
? ? }
?
? ? while (sum >= 10){
? ? ? ? addee.get(index)->digit = sum % 10;
?
? ? ? ? if (index == 0)//需要變動最高位
? ? ? ? {
? ? ? ? ? ? Node* newHead = new Node('1');
? ? ? ? ? ? newHead->next = addee.header;
? ? ? ? ? ? addee.header = newHead;
? ? ? ? ? ? break;
? ? ? ? }
?
? ? ? ? sum = addee.get(--index)->digit + sum / 10;
? ? ? ? if (sum < 10)
? ? ? ? {
? ? ? ? ? ? addee.get(index)->digit = sum;
? ? ? ? ? ? break;
? ? ? ? }
? ? }
}
錯誤是很簡單的,此處傳遞的List應該是List*,而非List;這一點相信在交換兩個整數值的函數中就已明確。我犯錯的原因,大概是不知不覺間又用了java的思維——一切都是引用變量。
?
解決方案很簡單,該用地址傳遞即可。
void addMostDigit(List* addee, List* adder){
? ? int index = addee->size() - adder->size();
? ? int sum = addee->get(index)->digit + adder->header->digit;
? ? adder->header = adder->header->next;
? ??
? ? if (sum < 10)
? ? {
? ? ? ? addee->get(index)->digit = sum;
? ? ? ? return;
? ? }
? ??
? ? while (sum >= 10){
? ? ? ? addee->get(index)->digit = sum % 10;
? ? ? ??
? ? ? ? if (index == 0)
? ? ? ? {
? ? ? ? ? ? Node* newHead = new Node('1');
? ? ? ? ? ? newHead->next = addee->header;
? ? ? ? ? ? addee->header = newHead;
? ? ? ? ? ? break;
? ? ? ? }
? ? ? ??
? ? ? ? sum = addee->get(--index)->digit + sum / 10;
? ? ? ? if (sum < 10)
? ? ? ? {
? ? ? ? ? ? addee->get(index)->digit = sum;
? ? ? ? ? ? break;
? ? ? ? }
? ? }
}
從這個角度講,java的原點運算符實際上等價于C++的->,而java編程時的規則,不過是C++可遵守的諸多規則之一而已。
換而言之,在棧幀的調用時,準備的入口參數中,真的包含了List這個struct的實體。那么,如果struct很大的話,這樣的函數調用豈不是花費巨大?如果這樣,那么全部用指針或引用(引用更安全一些),或許會是一種很好的編程方法。